/**
****************************(C) COPYRIGHT 2025 ROBOT-Z****************************
  * @file       gimbal_behaviour.c/h
  * @brief      2025赛季哨兵，根据遥控器的值，决定云台行为
  * @note
  * @history
  *  Version    Date            Author          Modification
  *  V1.0.0     Dec-26-2018     RM              1. done
  *  V1.1.0     Nov-11-2019     RM              1. 添加一些注释
  *  V2.0.0     Jan-1-2024      申欣宇           1. 优化云台行为逻辑
  *  V3.0.0     Dev-20-2024     吴森桦           1. 添加自瞄模式
  *                             冉文治           2. 添加巡逻模式
  *                                             3. 删除不必要的模式，简化代码
  *
  @verbatim
  ==============================================================================
	如果要添加一个新的行为模式
	1.首先，在gimbal_behaviour.h文件中， 添加一个新行为名字在 gimbal_behaviour_e
	erum
	{
		...
		...
		GIMBAL_XXX_XXX, // 新添加的
	}gimbal_behaviour_e,
	2. 实现一个新的函数 gimbal_xxx_xxx_control(fp32 *yaw, fp32 *pitch, gimbal_control_t *gimbal_control_set);
		"yaw, pitch" 参数是云台运动控制输入量
		第一个参数: 'yaw' 通常控制yaw轴移动,通常是角度增量,正值是逆时针运动,负值是顺时针
		第二个参数: 'pitch' 通常控制pitch轴移动,通常是角度增量,正值是逆时针运动,负值是顺时针
		在这个新的函数, 你能给 "yaw"和"pitch"赋值想要的参数
	3.  在"gimbal_behavour_set"这个函数中，添加新的逻辑判断，给gimbal_behaviour赋值成GIMBAL_XXX_XXX
		在gimbal_behaviour_mode_set函数最后，添加"else if(gimbal_behaviour == GIMBAL_XXX_XXX)" ,然后选择一种云台控制模式
	4.  在"gimbal_behaviour_control_set" 函数的最后，添加
		else if(gimbal_behaviour == GIMBAL_XXX_XXX)
		{
			gimbal_xxx_xxx_control(&rc_add_yaw, &rc_add_pit, gimbal_control_set);
		}
  ==============================================================================
  @endverbatim
  ****************************(C) COPYRIGHT 2025 ROBOT-Z****************************
  */

#ifndef GIMBAL_BEHAVIOUR_H
#define GIMBAL_BEHAVIOUR_H

#include "main.h"
#include "gimbal_task.h"

#define YAW_PATROL		-0.004f
#define PITCH_PATROL 	-0.0015f

typedef enum
{
	GIMBAL_ZERO_FORCE = 0,
	GIMBAL_INIT,
	GIMBAL_ABSOLUTE_ANGLE,
	GIMBAL_RELATIVE_ANGLE,
	GIMBAL_MOTIONLESS,
	GIMBAL_CV
} gimbal_behaviour_e;

extern gimbal_behaviour_e  gimbal_behaviour;

/**
  * @brief          被gimbal_set_mode函数调用在gimbal_task.c,云台行为状态机以及电机状态机设置
  * @author         吴森桦
  * @param          gimbal_mode_set 云台数据指针
  * @retval         none
  */
extern void gimbal_behaviour_mode_set(gimbal_control_t *gimbal_mode_set);

/**
  * @brief          云台行为控制，根据不同行为采用不同控制函数
  * @author         吴森桦
  * @param          add_yaw 设置的yaw角度增加值，单位 rad
  * @param          add_pitch 设置的pitch角度增加值，单位 rad
  * @param          gimbal_control_set 云台数据指针
  * @retval         none
  */
extern void gimbal_behaviour_control_set(fp32 *add_yaw, fp32 *add_pitch, gimbal_control_t *gimbal_control_set);
/**
  * @brief          云台在某些行为下，需要底盘不动
  * @author         吴森桦
  * @param          none
  * @retval         1: no move 0:normal
  */
extern bool_t gimbal_cmd_to_chassis_stop(void);
/**
  * @brief          云台在某些行为下，需要射击停止
  * @author         吴森桦
  * @param          none
  * @retval         1: no move 0:normal
  */
extern bool_t gimbal_cmd_to_shoot_stop(void);

#endif
